5.12. Ключевые слова в Groovy
Ключевые слова в Groovy
Groovy использует все ключевые слова Java и добавляет собственные для упрощения синтаксиса. Справочник разделён на логические группы для удобства использования.
Управление потоком выполнения
| Ключевое слово | Значение | Пример |
|---|---|---|
if | Условное выполнение кода при истинности выражения | if (age >= 18) println "Совершеннолетний" |
else | Альтернативное выполнение кода при ложности условия if | if (temp > 30) println "Жарко" else println "Прохладно" |
switch | Множественный выбор на основе значения выражения | switch (day) { case 1: println "Понедельник"; break; default: println "Другой день" } |
case | Метка варианта в конструкции switch | case "admin": access = true; break |
default | Обработчик значений по умолчанию в switch | default: println "Неизвестный статус" |
while | Цикл с предусловием | while (count < 5) { println count; count++ } |
do | Начало цикла с постусловием вместе с while | do { println value; value-- } while (value > 0) |
for | Цикл с инициализацией, условием и шагом | for (int i = 0; i < 10; i++) println i |
break | Прерывание текущего цикла или оператора switch | for (item in list) { if (item == target) break } |
continue | Переход к следующей итерации цикла | for (n in numbers) { if (n % 2 == 0) continue; println n } |
return | Возврат значения из метода и завершение его выполнения | def square(x) { return x * x } |
assert | Проверка условия во время выполнения с генерацией исключения при нарушении | assert balance >= 0 : "Отрицательный баланс" |
Обработка исключений
| Ключевое слово | Значение | Пример |
|---|---|---|
try | Блок кода, в котором могут возникнуть исключения | try { readFile() } catch (IOException e) { println "Ошибка" } |
catch | Обработчик перехваченного исключения | catch (FileNotFoundException e) { log.error(e) } |
finally | Блок, выполняемый в любом случае после try | finally { connection.close() } |
throw | Генерация исключения вручную | throw new IllegalArgumentException("Неверный параметр") |
throws | Объявление возможных исключений в сигнатуре метода | def process() throws IOException { ... } |
Объявление классов и методов
| Ключевое слово | Значение | Пример |
|---|---|---|
class | Объявление нового класса | class User { String name; int age } |
interface | Объявление интерфейса | interface Logger { void log(String message) } |
trait | Объявление черты для множественного наследования поведения | trait Greeting { String hello() { "Привет" } } |
enum | Объявление перечисления | enum Status { ACTIVE, INACTIVE, SUSPENDED } |
extends | Указание родительского класса при наследовании | class Admin extends User { ... } |
implements | Указание реализуемых интерфейсов | class FileLogger implements Logger { ... } |
new | Создание нового экземпляра класса | def user = new User(name: "Анна", age: 30) |
this | Ссылка на текущий объект экземпляра | def setName(String n) { this.name = n } |
super | Ссылка на родительский класс | super(name); this.department = dept |
package | Объявление пакета для класса | package com.example.app |
import | Подключение классов из других пакетов | import java.util.Date |
Модификаторы доступа и свойства
| Ключевое слово | Значение | Пример |
|---|---|---|
public | Открытый доступ из любого места | public class Service { ... } |
protected | Доступ внутри пакета и подклассов | protected String apiKey |
private | Доступ только внутри текущего класса | private int secretValue |
static | Принадлежность элемента классу, а не экземпляру | static int counter = 0 |
final | Запрет изменения значения переменной или переопределения метода | final String VERSION = "1.0" |
abstract | Объявление абстрактного класса или метода без реализации | abstract class Shape { abstract double area() } |
synchronized | Синхронизация доступа к методу в многопоточной среде | synchronized void update() { ... } |
transient | Исключение поля из сериализации | transient String tempData |
volatile | Гарантия видимости изменений переменной между потоками | volatile boolean running = true |
native | Объявление метода, реализованного вне JVM | native void systemCall() |
strictfp | Принудительное соблюдение IEEE 754 для вычислений с плавающей точкой | strictfp class Calculator { ... } |
Специфичные для Groovy ключевые слова
| Ключевое слово | Значение | Пример |
|---|---|---|
def | Объявление переменной или метода без указания конкретного типа | def name = "Грэйди"; def greet() { "Привет" } |
in | Проверка вхождения элемента в коллекцию или итерация в цикле | if ("admin" in roles) { ... }; for (item in list) { ... } |
as | Приведение типа или преобразование объекта | def num = "42" as Integer; list as Set |
Литералы и значения
| Ключевое слово | Значение | Пример |
|---|---|---|
true | Логическая истина | boolean active = true |
false | Логическая ложь | if (!valid) return false |
null | Отсутствие значения или ссылки | String name = null |
instanceof | Проверка принадлежности объекта к типу | if (obj instanceof String) { ... } |
Операторы и логические конструкции
| Ключевое слово | Значение | Пример |
|---|---|---|
&& | Логическое И — оба условия должны быть истинными | if (age >= 18 && hasLicense) println "Можно водить" |
| ` | ` | |
! | Логическое НЕ — инверсия булевого значения | if (!isEmpty) println "Есть данные" |
? | Тернарный оператор для краткой записи условия | def status = isActive ? "Активен" : "Неактивен" |
?: | Оператор Элвиса — возвращает левый операнд или правый при null | def name = userName ?: "Гость" |
Контекстные ключевые слова и модификаторы
| Ключевое слово | Значение | Пример |
|---|---|---|
const | Объявление константы времени компиляции | static final int MAX_SIZE = 100 |
var | Вывод типа переменной на основе присваиваемого значения | var list = [1, 2, 3]; var name = "Тест" |
by | Делегирование свойств через объект | class User { String name by delegate } |
with | Выполнение блока кода в контексте объекта | user.with { name = "Алекс"; age = 25 } |
tap | Выполнение блока и возврат исходного объекта | def result = new User().tap { name = "Мария" } |
let | Выполнение блока с объектом и возврат результата блока | def length = "Groovy".let { it.size() } |
Ключевые слова для работы с потоками
| Ключевое слово | Значение | Пример |
|---|---|---|
thread | Создание и управление потоками выполнения | thread { println "В фоновом потоке" } |
synchronized | Синхронизация доступа к критической секции | synchronized void update() { counter++ } |
Директивы компилятора
| Ключевое слово | Значение | Пример |
|---|---|---|
@Grab | Автоматическое подключение зависимостей из Maven | @Grab('org.apache.commons:commons-lang3:3.12.0') |
@Field | Преобразование переменной скрипта в поле класса | @Field String name = "Глобальное" |
@Lazy | Отложенная инициализация свойства | @Lazy List items = loadItems() |
@Delegate | Автоматическая делегация методов | @Delegate Date birthday |
@Memoized | Кэширование результатов метода | @Memoized int factorial(int n) { ... } |
@TypeChecked | Статическая проверка типов во время компиляции | @TypeChecked void process() { ... } |
@CompileStatic | Статическая компиляция для повышения производительности | @CompileStatic int calculate() { ... } |
Зарезервированные слова (не используемые в текущих версиях)
| Ключевое слово | Значение | Пример |
|---|---|---|
goto | Зарезервировано, но не реализовано | — |
const | Зарезервировано для будущего использования | — |
Специальные операторы и синтаксические конструкции
| Конструкция | Значение | Пример |
|---|---|---|
<=> | Оператор сравнения (возвращает -1, 0, 1) | def cmp = a <=> b |
==~ | Проверка соответствия регулярному выражению | if (text ==~ /\d+/) println "Только цифры" |
=~ | Создание объекта сопоставления с регулярным выражением | def matcher = text =~ /\w+/ |
*. | Оператор распыления — вызов метода для всех элементов коллекции | names*.toUpperCase() |
?. | Безопасное обращение к методу или свойству | user?.address?.city |
&. | Оператор цепочки вызовов с сохранением контекста | list.collect { it * 2 }&.sort() |
.@ | Прямой доступ к полю объекта, минуя геттер | user.@name = "Напрямую" |
as | Приведение типа или преобразование | "123" as Integer |
in | Проверка принадлежности к коллекции | if (item in list) { ... } |
Ключевые слова для метапрограммирования
| Ключевое слово | Значение | Пример |
|---|---|---|
metaClass | Доступ к метаклассу объекта для динамического изменения | String.metaClass.shout = { -> delegate.toUpperCase() } |
propertyMissing | Перехват обращения к несуществующему свойству | def propertyMissing(String name) { ... } |
methodMissing | Перехват вызова несуществующего метода | def methodMissing(String name, args) { ... } |
invokeMethod | Перехват всех вызовов методов объекта | def invokeMethod(String name, args) { ... } |